#include "Clase.h"
#include <string.h>

Clase::Clase(std::string nombre, int codigo, bool *clase_terminada) {
	this->nombre = nombre;
	this->codigo = codigo;
	this->clase_terminada = (*clase_terminada);
	clase_iniciada = false;
	en_accion = false;
}

int Clase::getCodigo() {
    return codigo;
}

std::list<Socket*> Clase::getSocket_alumnos_av() {
    return socket_alumnos_av;
}


void Clase::setSocket_Instr(Socket* socket_instructor_av) {
	this->socket_instructor_av = socket_instructor_av;
}

void Clase::setCodigo(int codigo) {
    this->codigo = codigo;
}

void Clase::inscribirAlumno(std::string nombre_Alumno) {
	this->alumnos_inscriptos.push_back(nombre_Alumno);
}

void Clase::agregarSocketAlumno_AV(Socket *socket_av) {
	this->socket_alumnos_av.push_back(socket_av);
}

void Clase::verInscriptos() {
	std::list<std::string>::iterator it;
	std::cout << "Alumnos inscriptos: " << std::endl;
	int aux = 0;
	for(it = alumnos_inscriptos.begin(); it != alumnos_inscriptos.end(); ++it) {
		aux++;
		std::cout << "Alumno " << aux << " : "  << it->c_str() << std::endl;
	}
}

// Recibe y envia frames
void Clase::run() {
	char buffer[TAM_BLOQUE_INI];
	char cod_op;
	int tam_arg = 0;
	//std::ofstream arch("clase.avi");
	while(clase_terminada == false) {
		if(!(socket_instructor_av->recibir(buffer, 1))) {
			std::cerr << "Se desconecto el cliente" << std::endl;
			break;
		}
		cod_op = buffer[0];
		std::cout << "CODIGO " << cod_op << std::endl;
		if(cod_op != '0') {
			std::cerr << "Codigo de operacion invalido" << std::endl;
			break;
		}
		if(!(socket_instructor_av->recibir(&buffer[1], 4))) {
			std::cerr << "Se desconecto el cliente" << std::endl;
			break;
		}
		tam_arg = *(unsigned int*)&buffer[1];
		//std::cout << "tam: (run clase) " << tam_arg << std::endl;
		memmove(buffer, &buffer[(TAM_BLOQUE_INI -1)], TAM_BLOQUE_INI - (TAM_BLOQUE_INI -1));
		char *argumentos = new char[tam_arg];
		if(tam_arg > 0) {
			switch(cod_op) {
			case '0': {
				if(!(socket_instructor_av->recibir(argumentos, tam_arg))) {
					std::cerr << "Se desconecto el cliente" << std::endl;
					delete[] argumentos;
					break;
				}
				//arch.write((const char*) argumentos, tam_arg);
				for(it_socket = socket_alumnos_av.begin(); it_socket != socket_alumnos_av.end(); it_socket++) {
					cod_op = 'F';
					if(!(*it_socket)->enviar(&cod_op, sizeof(cod_op))) {
						std::cerr << "No se pudo enviar el codigo" << std::endl;
						break;
					}
					if(!(*it_socket)->enviar(&tam_arg, sizeof(tam_arg))) {
						std::cerr << "No se pudo enviar el tamanio" << std::endl;
						break;
					}
					if(!(*it_socket)->enviar(argumentos, tam_arg)) {
						std::cerr << "No se pudo enviar el bloque de argumentos" << std::endl;
						break;
					}
				}
				break;
			}
			}
		}
		delete[] argumentos;
	}
	std::cout << "Fin de la clase" << std::endl;
}

void Clase::terminarClase() {
	this->clase_terminada = true;
}

void Clase::iniciarClase() {
	this->clase_terminada = false;
}

Clase::~Clase() {
}
